/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package threeds.Model;

import excecoes.KeyException;
import java.io.Serializable;


/**
 * Módulo MR
 * Essa classe é um modelo da Associação entre Tabela e atributo do MR, contem seus atributos privados e métodos para acesso aos atributos
 * //author Eduardo, Maylon e Kamilla
 */
//Entity
//Table(name = "associacaotabelaatributo", catalog = "databasethreeds", schema = "public")
//XmlRootElement
//NamedQueries({
    //NamedQuery(name = "AssociacaoTabelaAtributo.findAll", query = "SELECT a FROM AssociacaoTabelaAtributo a"),
    //NamedQuery(name = "AssociacaoTabelaAtributo.findByPrimaria", query = "SELECT a FROM AssociacaoTabelaAtributo a WHERE a.primaria = :primaria"),
    //NamedQuery(name = "AssociacaoTabelaAtributo.findByEstrangeira", query = "SELECT a FROM AssociacaoTabelaAtributo a WHERE a.estrangeira = :estrangeira"),
    //NamedQuery(name = "AssociacaoTabelaAtributo.findByCandidata", query = "SELECT a FROM AssociacaoTabelaAtributo a WHERE a.candidata = :candidata"),
    //NamedQuery(name = "AssociacaoTabelaAtributo.findByCodigo", query = "SELECT a FROM AssociacaoTabelaAtributo a WHERE a.codigo = :codigo")})
public class AssociacaoTabelaAtributo implements Serializable {
    private static final long serialVersionUID = 1L;
    //Basic(optional = false)
    //Column(name = "primaria")
    private boolean primaria;
    //Basic(optional = false)
    //Column(name = "estrangeira")
    private boolean estrangeira;
    //Basic(optional = false)
    //Column(name = "candidata")
    private boolean candidata;
    //Id
    //Basic(optional = false)
    //Column(name = "codigo")
    private String codigo;
    //JoinColumn(name = "nometabela", referencedColumnName = "nome")
    //ManyToOne(optional = false)
    private Tabela nometabela;
    //JoinColumn(name = "nomeatributo", referencedColumnName = "nome")
    //ManyToOne(optional = false)
    private AtributoMR nomeatributo;

    /**
     * Método Construtor da classe
     */
    public AssociacaoTabelaAtributo() {
    }

    /**
     * Método Construtor da classe
     * //param tabela Tabela que será associada
     * //param atributomr Atributo Mr que será associado
     * //param primaria Se atributo for chave primario
     * //param estrangeira Se atributo for chave estrangeira
     * //param candidata Se atributo for chave candidata
     * //throws KeyException 
     */
    public AssociacaoTabelaAtributo(Tabela tabela, AtributoMR atributomr,boolean primaria, boolean estrangeira, boolean candidata) throws KeyException {
           this.primaria = false;
           this.candidata = false;
           this.estrangeira = false;
           
           this.nomeatributo = atributomr;
           this.nometabela = tabela;
           this.codigo = tabela.getNome()+atributomr.getNome();
           this.setPrimaria(primaria);
           this.setEstrangeira(estrangeira);
           this.setCandidata(candidata);  
        
    }

    /**
     * 
     * //param tabela
     * //param atributomr 
     */
    public AssociacaoTabelaAtributo(Tabela tabela, AtributoMR atributomr) {
        this.nomeatributo = atributomr;
        this.nometabela = tabela;
        this.codigo = tabela.getNome()+atributomr.getNome();
    }
    
    /**
     * Retorna o valor 
     * //return 
     */
    public boolean getPrimaria() {
        return primaria;
    }

    /**
     * Atribuir valor 
     * //param 
     */
    public void setPrimaria(boolean primaria) throws KeyException {
        if(VerificacaoModel.justOneKindOfKey(primaria, this.candidata, this.estrangeira))
            this.primaria = primaria;
        else
            throw new KeyException("O atributo pode ser apenas um tipo de chave ao mesmo tempo!");
    }

    /**
     * Retorna o valor 
     * //return 
     */
    public boolean getEstrangeira() {
        return estrangeira;
    }

    /**
     * Atribuir valor 
     * //param 
     */
    public void setEstrangeira(boolean estrangeira) throws KeyException {
        if(VerificacaoModel.justOneKindOfKey(primaria, this.candidata, estrangeira))
            this.estrangeira = estrangeira;
        else
            throw new KeyException("O atributo pode ser apenas um tipo de chave ao mesmo tempo!");
    }

    /**
     * Retorna o valor 
     * //return 
     */
    public boolean getCandidata() {
        return candidata;
    }

    /**
     * Atribuir valor 
     * //param 
     */
    public void setCandidata(boolean candidata) throws KeyException {
        if(VerificacaoModel.justOneKindOfKey(primaria, candidata, this.estrangeira))
            this.candidata = candidata;
        else
            throw new KeyException("O atributo pode ser apenas um tipo de chave ao mesmo tempo!");
    }

    /**
     * Retorna o valor 
     * //return 
     */
    public String getCodigo() {
        return codigo;
    }

    /**
     * Retorna o valor 
     * //return 
     */
    public Tabela getNometabela() {
        return nometabela;
    }

    /**
     * Atribuir valor 
     * //param 
     */
    public void setNometabela(Tabela nometabela) {
        this.nometabela = nometabela;
    }

    /**
     * Retorna o valor 
     * //return 
     */
    public AtributoMR getNomeatributo() {
        return nomeatributo;
    }

    /**
     * Atribuir valor 
     * //param 
     */
    public void setNomeatributo(AtributoMR nomeatributo) {
        this.nomeatributo = nomeatributo;
    }

    //Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo != null ? codigo.hashCode() : 0);
        return hash;
    }

    //Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof AssociacaoTabelaAtributo)) {
            return false;
        }
        AssociacaoTabelaAtributo other = (AssociacaoTabelaAtributo) object;
        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
            return false;
        }
        return true;
    }

    /**
     * Retorna uma String para a classe
     * //return 
     */
    //Override
    public String toString() {
        return "model.AssociacaoTabelaAtributo[ codigo=" + codigo + " ]";
    }
    
}
